"Les cours de neeko.fr"

Retour en haut

Java : les exceptions

Catch me if you can

Principe

En Java, les exceptions sont des classes particulières qui permettent de faire "remonter" des informations, sans passer passer le mot clé "return".

De nombreuses méthodes de classes utilisent ce mécanisme, qu'elles viennent des librairies Java, Android ou même de développeurs indépendants.

Une exception lévée représente un problème dans le déroulement d'un programme. Cela peut etre une erreur, ou un cas particulier qui ne permet pas à la méthode appellée de continuer à s'exécuter.

Il existe une classe de base Exception, et d'autres classes d'exception en hérite.

Attrapez les toutes

Une exception est lancée par une méthode, si la méthode le décide. Par exemple si un parametre ne lui convient pas, ou que quelque chose ne se passe pas comme prévu : une connexion echouée, un fichier qui n'existe pas...

Les méthodes appellantes peuvent alors l'attraper ou la laisser passer.

Si personne n'attrape l'exception, l'application s'arrête (crash).

Si on attrape l'exception, on peut alors continuer le cours du programme.

Lorsqu'une exception est lévée, la suite du code est ignorée. On reprends l'éxecution dans le "catch" correspondant.

Exemples

Le code suivant provoquerai l'arret de l'application, car une exception est lancée sans jamais être attrapée :

System.out.println("Ca commence"); int valeur2 = Integer.parseInt("blabla"); System.out.println("Ceci ne sera jamais affiché");

Ca commence java.lang.NumberFormatException: unable to parse 'blabla' as integer (crash)

Mais grace au mécanisme de try/catch

try { int valeur1 = Integer.parseInt("1"); int valeur2 = Integer.parseInt("blabla"); System.out.println("Ceci ne sera jamais affiché"); } catch(Exception e){ System.out.println("Il y a eu un probleme : " + e); } System.out.println("La vie continue");

Ca commence Il y a eu un probleme : java.lang.NumberFormatException: unable to parse 'blabla' as integer La vie continue

Autre exemple

System.out.println("Ca commence"); String[] lesBeatles = {"Lennon", "McCartney", "Harrison", "Starr"}; lesBeatles[5]; //aie System.out.println("Ceci ne sera jamais affiché");

Ca commence java.lang.ArrayIndexOutOfBoundsException (crash)

try { System.out.println("Ca commence"); String[] lesBeatles = {"Lennon", "McCartney", "Harrison", "Starr"}; String leCinquiemeBeatle = lesBeatles[4]; //aie System.out.println("Ceci ne sera jamais affiche"); } catch(Exception e){ System.out.println("Il y a eu un probleme : " + e); } System.out.println("La vie continue");

Ca commence Il y a eu un probleme : java.lang.ArrayIndexOutOfBoundsException La vie continue

Selon le cas, les méthodes lancent différents types d'exceptions. Toute exception doit hériter de Exception.

Il en existe un nombre indéfini, puisque n'importe qui peut en créer.

On peut choisir de n'attraper que certaines exceptions...Ou d'avoir un comportement adapté à chacunes. On peut avoir plusieurs cas de "catch", pour chaque exception, un peu comme une série de IF.

try { System.out.println("Ca commence"); String[] lesBeatles = {"Lennon", "McCartney", "Harrison", "Starr"}; String leCinquiemeBeatle = lesBeatles[4]; //aie int valeur1 = Integer.parseInt("1"); int valeur2 = Integer.parseInt("blabla"); System.out.println("Ceci ne sera jamais affiche"); } catch(ArrayIndexOutOfBoundsException e){ System.out.println("Il y a eu un probleme d'index : " + e); } catch(NumberFormatException e){ System.out.println("Il y a eu un probleme de nombre : " + e); } catch(Exception e){ System.out.println("Il y a eu un probleme indéfini : " + e); } System.out.println("La vie continue");

L'interet du système d'exception

Grace aux exceptions, une méthode peut renvoyer plusieurs types d'exception selon le besoin.

Grace aux exceptions, on peut laisser la responsabilité de traiter une exception à la méthode appelante.

Grace aux exceptions, on peut encapsuler des informations sur le probleme rencontré.

Aller plus loin

Les blocs try, catch, finally

On peut préciser (mais c'est optionnel) un bloc finally{} qui sera executé quelque soit l'exception attrapée, ou meme s'il n'y avait aucune exception. Cela peut etre pratique dans certains cas.

Lancer des exceptions

A n'importe quel endroit, on peut utiliser

throw new Exception();

throw new UnTypeSpecialException();

Créer des exceptions

Il suffit de créer une classe qui hérite d'Exception.